函数

feupdateenv (C++11)

int feupdateenv(const fenv_t *envp);

更新浮点环境

尝试用 envp 指向的对象建立 浮点环境 的状态。然后它会尝试触发在函数调用前设置在 浮点环境 中的异常。

调用这个函数的程序需要确保在本次函数调用时,编译指示 FENV_ACCESS 已经开启。

参数

要么是指向 fenv_t 对象的指针,要么是 浮点环境 的宏值之一:

宏名 描述
FE_DFL_ENV 默认的浮点环境(和程序启动时一样)

特定的库实现可能会支持附加的 浮点环境 状态值(它们对应的宏同样以 FE_ 开头的宏)。

返回值

如果函数成功,则返回 0, 否则返回非 0。

例子

  1. /* feholdexcept / feupdateenv example */
  2. #include <stdio.h> /* printf, puts */
  3. #include <fenv.h> /* feholdexcept, feclearexcept, fetestexcept, feupdateenv, FE_* */
  4. #include <math.h> /* log */
  5. #pragma STDC FENV_ACCESS on
  6. double log_zerook(double x)
  7. {
  8. fenv_t fe;
  9. feholdexcept(&fe);
  10. x = log(x);
  11. feclearexcept(FE_OVERFLOW | FE_DIVBYZERO);
  12. feupdateenv(&fe);
  13. return x;
  14. }
  15. int main()
  16. {
  17. feclearexcept(FE_ALL_EXCEPT);
  18. printf("log(0.0): %f\n", log_zerook(0.0));
  19. if(!fetestexcept(FE_ALL_EXCEPT));
  20. puts("no exceptions raised");
  21. return 0;
  22. }

可能的输出:

  1. log(0.0): -inf
  2. no exceptions raised

数据竞争

每个线程都保持着分离的、拥有自己状态的 浮点环境 。产生一个新线程就复制当前状态。[ 这个适用于 C11 和 C++11 的实现 ]

异常

不抛出异常的保证:这个函数从不抛出异常。
注意 C 浮点环境异常 不是 C++ 异常,因此不能被 try/catch 块捕捉。

另请参见

函数 描述
feupdateenv 更新浮点环境 (函数)
fegetenv 获取浮点环境 (函数)
fesetenv 设置浮点环境 (函数)